<?php

class ProductGroup_IndexController extends Zend_Controller_Action
{
	protected $_object;

	public function init()
	{
		//tạo đối tượng
		$this->_object = new Admin_Model_ProductGroup ();
		
		//lấy tiêu đề 
		$this->_helper->common->setCaptions ( array (), array ('product-group', 'warehouse-group' ) );
	}

	public function detailAction()
	{
		//lấy tham số
		$request = $this->_request;
		$id = $request->getParam ( 'id' );
		
		//lấy đối tượng cần cập nhật
		$this->_object->findBase ( $id );
		
		//tạo form
		$form = new ProductGroup_Form_ProductGroup_Detail ( $this );
		/*
		//Lay thong tin nhom kho
		$warehouse_group_model = new Admin_Model_WarehouseGroup ();
		$warehouse_groups = $warehouse_group_model->fetchAllBase ( NULL, 'warehouse_group_name ASC' );
		$warehouse_groups = $warehouse_group_model->toArray2 ( $warehouse_groups, 'warehouse_group_code', 'warehouse_group_name' );
		$form->product_group_warehouse_group_code->setMultiOptions ( array ('' => '- Chọn -' ) + $warehouse_groups );
		*/
		//Lay thong tin nhom san pham cha.
		$options = $this->_object->fetchOptions ( $this->_object->fetchGroups ( '', $id ) );
		$form->product_group_parent_group_code->setMultiOptions ( array ('' => '- Chọn -' ) + $options );		
		
		//đổ dữ liệu vào form 
		$form->populate ( $this->_object->toArray () );
		
		//truyền dữ liệu ra view
		$this->view->form = $form;
	}

	//xem danh sách tất cả 
	public function indexAction()
	{
		//lấy tham số
		$request = $this->_request;
		$product_group_parent_group_code = $request->getParam ( 'product_group_parent_group_code', '' );
		$product_group_status = $request->getParam ( 'product_group_status', '' );
		$product_group_code = $request->getParam ( 'product_group_code', '' );
		$product_group_name = $request->getParam ( 'product_group_name', '' );
		
		$prevent_id = '';
		
		//thiết lập điều kiện lấy dữ liệu
		$where = "";
		if ($product_group_status != '')
			$where .= " AND `product_group_status` = '$product_group_status' ";
		if ($product_group_code != '')
			$where .= " AND `product_group_code` LIKE '%$product_group_code%' ";
		if ($product_group_name != '')
			$where .= " AND `product_group_name` LIKE '%$product_group_name%' ";
		
		//thiết lập thứ tự lấy dữ liệu
		$order = $this->_helper->common->getOrderArray ( array ('product_group_order ASC' ) );
		
		//lấy dữ liệu
		$object_arr = ( array ) $this->_object->fetchObjects ( $this->_object->fetchGroups ( $product_group_parent_group_code, $prevent_id, $where, $order ) );
		
		//phân trang
		$this->_helper->common->paginate ( $object_arr );
		
		//truyền dữ liệu ra view
		$this->view->product_group_status = $product_group_status;
		$this->view->product_group_code = $product_group_code;
		$this->view->product_group_name = $product_group_name;
	}

	//kích hoạt/ vô hiệu hóa 1 hoặc nhiều dòng
	public function publishAction()
	{
		$this->_helper->action->publish ( $this->_object, 'product_group_status' );
	}

	//lưu thứ tự sắp xếp của các dòng
	public function saveOrderAction()
	{
		$this->_helper->action->saveOrder ( $this->_object, 'product_group_order' );
	}

	//xóa 1 hoặc nhiều dòng
	public function deleteAction()
	{
		$this->_helper->action->delete ( $this->_object, 'afterDelete', 'beforeDelete' );
	}

	//hàm kiểm tra dữ liệu ràng buộc trước khi xóa
	//nếu trả về true thì cho xóa, ngược lại kg cho xóa
	public function beforeDelete()
	{
		$request = Zend_Controller_Front::getInstance ()->getRequest ();
		$ids = ( array ) $request->getParam ( 'id' );
		$msg = "";
		foreach ( $ids as $id )
		{
			//lay nhom san pham
			$product_group = new Admin_Model_ProductGroup ();
			$product_group->findBase ( $id );
			
			//Kiem tra xem du lieu co thuoc nhom khac ko?
			if ($this->_object->fetchRowAllBase ( "product_group_parent_group_code = '{$product_group->product_group_code}' " ) !== FALSE)
			{
				$msg .= " - Nhóm sản phẩm có mã số: <strong>{$product_group->product_group_code}</strong>";
				break;
			}
			
			//Kiem tra xem nhom san pham co nam trong bang san pham tbl_product...
			$product = new Admin_Model_Product ();
			if ($product->fetchRowAllBase ( "product_product_group_code = '{$product_group->product_group_code}' " ) !== FALSE)
			{
				$msg .= " - Sản phẩm có mã số: <strong>{$product->product_code}</strong>";
				break;
			}
		}
		if ($msg != "")
		{
			$msg = "Dữ liệu này đã có trong:<br />" . $msg;
			$this->_helper->flashMessenger ( $msg );
			return false;
		}
		return true;
	}

	//hàm giải phóng dữ liệu liên quan sau khi xóa
	public function afterDelete()
	{
	
	}

	//thêm 1 dòng
	public function insertAction()
	{
		//lấy tham số
		$request = $this->_request;		
		
		//tạo form
		$form = new ProductGroup_Form_ProductGroup_Insert ( $this );
		/*
		//Lay thong tin nhom kho
		$warehouse_group_model = new Admin_Model_WarehouseGroup ();
		$warehouse_groups = $warehouse_group_model->fetchAllBase ( NULL, 'warehouse_group_name ASC' );
		$warehouse_groups = $warehouse_group_model->toArray2 ( $warehouse_groups, 'warehouse_group_code', 'warehouse_group_name' );
		$form->product_group_warehouse_group_code->setMultiOptions ( array ('' => '- Chọn -' ) + $warehouse_groups );
		*/
		//Lay thong tin nhom san pham cha.
		$options = $this->_object->fetchOptions ( $this->_object->fetchGroups ($inbound_warehouse_group_code) );
		$form->product_group_parent_group_code->setMultiOptions ( array ('' => '- Chọn -' ) + $options );
		
		//phần xử lí chính
		if ($request->isPost ()) //khi post giá trị
		{
			if ($form->isValid ( $request->getPost () )) //khi giá trị trong form đã được kiểm tra thành công
			{
				$adminAction = $form->getValue ( 'adminAction' );
				$product_group = new Admin_Model_ProductGroup ( $form->getValues () );
				
				//kiểm tra có trùng code không?
				$exist = $this->_object->countBase ( "`product_group_code`='{$product_group->product_group_code}'", 0 ) > 0;
				
				//nếu trùng mã báo lỗi
				if ($exist)
				{
					$form->getElement ( 'product_group_code' )->addError ( $this->_helper->common->getCaption ( 'product_group_code' ) . ' đã tồn tại.' );
					$form->markAsError ();
				}
				
				//nếu form không có lỗi
				if (! $form->isErrors ())
				{
					try
					{
						if ($product_group->getProduct_group_parent_group_code () != "")
						{
							//Lay thong tin nhom cha
							$where = "product_group_code = '{$product_group->product_group_parent_group_code}' ";
							$product_group_parent_level = $this->_object->fetchOneBase ( 'product_group_level', $where, 0 );
							
							$product_group->product_group_level = $product_group_parent_level + 1;
						}
						
						//insert dòng mới
						$product_group->insertBase ();
						
						//thông báo + chuyển hướng trang khi thành công				
						$this->_helper->flashMessenger ( 'Thêm thành công.' );
						if ($adminAction == 'save-and-close')
						{
							$this->_helper->redirector ( 'index', 'index', 'product-group', array () );
						}
						else if ($adminAction == 'save-and-new')
						{
							$this->_helper->redirector ( 'insert', 'index', 'product-group', array () );
						}
					}
					catch ( Exception $e )
					{
					
					}
				}
			}
		}
		else //khi vào form lần đầu tiên
		{
		
		}
		
		//truyền dữ liệu ra view
		$this->view->form = $form;
	}

	//cập nhật 1 dòng
	public function updateAction()
	{
		//lấy tham số
		$request = $this->_request;
		$id = $request->getParam ( 'id' );
		if (is_array ( $id ))
			$id = $id [count ( $id ) - 1];
		
		//lấy đối tượng cần cập nhật
		$first_product_group = new Admin_Model_ProductGroup ();
		$first_product_group->findBase ( $id );
		
		//tạo form
		$form = new ProductGroup_Form_ProductGroup_Update ( $this );
		/*
		//Lay thong tin nhom kho
		$warehouse_group_model = new Admin_Model_WarehouseGroup ();
		$warehouse_groups = $warehouse_group_model->fetchAllBase ( NULL, 'warehouse_group_name ASC' );
		$warehouse_groups = $warehouse_group_model->toArray2 ( $warehouse_groups, 'warehouse_group_code', 'warehouse_group_name' );
		$form->product_group_warehouse_group_code->setMultiOptions ( array ('' => '- Chọn -' ) + $warehouse_groups );
		*/
		//Lay thong tin nhom san pham cha.
		$options = $this->_object->fetchOptions ( $this->_object->fetchGroups ( '', $id ) );
		$form->product_group_parent_group_code->setMultiOptions ( array ('' => '- Chọn -' ) + $options );
		
		//phần xử lí chính
		if ($request->isPost ()) //khi post giá trị
		{
			if ($form->isValid ( $request->getPost () )) //khi giá trị trong form đã được kiểm tra thành công
			{
				$adminAction = $form->getValue ( 'adminAction' );
				$product_group = new Admin_Model_ProductGroup ( $form->getValues () );
				
				//kiểm tra có trùng code không?
				$exist = $this->_object->countBase ( "`product_group_code`='{$product_group->product_group_code}' AND product_group_id<>$id ", 0 ) > 0;
				
				//nếu trùng mã báo lỗi
				if ($exist)
				{
					$form->getElement ( 'product_group_code' )->addError ( $this->_helper->common->getCaption ( 'product_group_code' ) . ' đã tồn tại.' );
					$form->markAsError ();
				}
				
				//nếu form không có lỗi
				if (! $form->isErrors ())
				{
					try
					{
						$product_group->product_group_level=0;
						if ($product_group->getProduct_group_parent_group_code () != "")
						{
							//Lay thong tin nhom cha
							$where = "product_group_code = '{$product_group->product_group_parent_group_code}' ";
							$product_group_parent_level = $this->_object->fetchOneBase ( 'product_group_level', $where, 0 );							
							$product_group->product_group_level = $product_group_parent_level + 1;
						}
						
						//update dữ liệu
						$product_group->updateBase ( $id );
						
						//thông báo + chuyển hướng trang khi thành công				
						$this->_helper->flashMessenger ( 'Cập nhật thành công.' );
						if ($adminAction == 'apply')
						{
							$this->_helper->redirector ( 'update', 'index', 'product-group', array ('id' => $id ) );
						}
						else if ($adminAction == 'save-and-close')
						{
							$this->_helper->redirector ( 'index', 'index', 'product-group', array () );
						}
						else if ($adminAction == 'save-and-new')
						{
							$this->_helper->redirector ( 'insert', 'index', 'product-group', array () );
						}
					}
					catch ( Exception $e )
					{
					
					}
				}
			}
		}
		else //khi vào form lần đầu tiên
		{
			$form->populate ( $first_product_group->toArray () );
		}
		
		//truyền dữ liệu ra view
		$this->view->form = $form;
	}
}